
package com.scott.itcast.thread.lesson15;

/**
 * 多线程共享数据 设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。写出程序
 * 方法4-2
 * 如果每个线程的执行代码不同,这时候需要不同的Runnable对象(比如例子中的runnableA和runnableB)
 * 把共享数据封装到另外1个对象中(ShareData)。然后将这个对象的实例share逐一传递给各个Runnable对象(比如例子中的runnableA和runnableB)
 * 每个线程对共享数据的操作方法也分配到那个对象上去完成。(inc和dec都在ShareData中实现)
 * 这样就实现了针对该数据(ShareData中的变量j)进行操作的各个线程之间的互斥和通信。
 * 
 */
public class MultiThreadShareData {
	public static void main(String args[]) {
		
		final ShareData share = new ShareData();
		for (int i = 0; i < 2; i++) {
			
			//在线程A中要做的事情
			Runnable runnableA = new Runnable(){
				public void run() {
					//增加
					share.inc();
				}
			};
			//启动线程A
			new Thread(runnableA).start();
			
			
			//在线程B中要做的事情
			Runnable runnableB = new Runnable(){
				public void run() {
					//减少
					share.dec();
				}
			};
			
			//启动线程B
			new Thread(runnableB).start();
		}
	}
}


//共享的数据
class ShareData{
	private int j =0;
	
	//增加
	public synchronized void inc() {
		for(int i =0; i<100;i++){
			j++;
			System.out.println(Thread.currentThread().getName() + "-inc增加:" + j);
		}
	}
	
	//减少
	public synchronized void dec() {
		for(int i =0;i<100;i++){
			j--;
			System.out.println(Thread.currentThread().getName() + "-dec减少:" + j);
		}
	}
}
